import globalConfig from '@/common/config/config.js';
import dialog from '@/common/utils/dialog.js';
import router from '@/common/utils/router.js';
import auth from '../utils/auth';
import store from '@/store/index.js';
let toastCount = 0;
let timer = null;
const pendingRequests = new Map();

// 生成请求的唯一标识键
function generateReqKey(config) {
	// 结合方法、URL、参数生成唯一key[2,3](@ref)
	const {
		method,
		url,
		data,
		params
	} = config;
	// 对参数进行序列化，确保相同参数生成相同key
	const serializedData = data ? JSON.stringify(data) : '';
	const serializedParams = params ? JSON.stringify(params) : '';
	if (data.prohibitRepeatRequest) {
		// 忽略参数，相同URL为同一个key
		return `${method}-${url}`;
	} else {
		return `${method}-${url}-${serializedData}-${serializedParams}`;

	}
}
// 初始化请求配置
uni.$u.http.setConfig((config) => {
	/* config 为默认全局配置*/
	// console.log('config', config);
	config.baseURL = globalConfig.baseURL
	config.custom = {
		auth: true,
		catch: true
	}
	const customConfig = {
		timeout: 1000 * 60 * 10,

	}
	config = {
		...config,
		...customConfig,
	}
	return config
})

function request(vm) {



	// 请求拦截
	uni.$u.http.interceptors.request.use((config) => { // 可使用async await 做异步操作
		// 初始化请求拦截器时，会执行此方法，此时data为undefined，赋予默认{}
		// console.log('config.data instanceof FormData:', config);
		config.data = config.data || {}
		toastCount++;

		if (config.method !== "UPLOAD") {
			const requestKey = generateReqKey(config);
			let temRequestTask = null;
			// console.log('1:', 1);
			config.getTask = (requestTask, config) => {
				temRequestTask = requestTask;
				// console.log('temRequestTask:', temRequestTask);
				// 标记此请求为进行中
				pendingRequests.set(requestKey, {
					timestamp: Date.now(),
					config: config,
					requestTask: temRequestTask
				});
				// 代理task
				if (config.custom.getTaskProxy) {
					config.custom.getTaskProxy(requestTask, config)
				}
				// console.log('2:', 2);
			}

			// console.log('pendingRequests.get(requestKey):', pendingRequests.get(requestKey));
			// console.log('config:', config);
			// 如果已有相同请求正在进行
			if (pendingRequests.has(requestKey)) {
				// console.log('3:', 3);
				// console.log(`拦截重复请求: ${requestKey}`);

				const requestTask = pendingRequests.get(requestKey).requestTask;
				requestTask.abort();
				// pendingRequests.delete(requestKey);
			}
		}




		config.header.token = vm.$store.state.$userInfo.token;

		timer = setTimeout(() => {
			if (timer) return
			if (toastCount !== 0) {
				uni.showLoading({
					title: 'loading...'
				})
			}
		}, 0)
		// return Promise.reject({
		// errMsg: 'duplicateRequest',
		// 	__isDuplicateRequest: true,
		// 	requestKey: 11,
		// 	config: config
		// });
		// console.log(config.url, config)
		return config
	}, config => { // 可使用async await 做异步操作
		return Promise.reject(config)
	})

	// 响应拦截
	uni.$u.http.interceptors.response.use((response) => {

		const requestKey = generateReqKey(response.config);
		// console.log('pendingRequests:', pendingRequests);
		pendingRequests.delete(requestKey);
		/* 对响应成功做点什么 可使用async await 做异步操作*/
		const data = response.data
		console.log('========' + response.config.url, data)
		toastCount--
		if (toastCount === 0) {
			clearTimeout(timer);
			uni.hideLoading()
			timer = null;
		}
		// 自定义参数
		const custom = response.config?.custom;
		// console.log('custom', custom)
		if (data.code === 1) {

			if (data.msg && custom?.toast) {
				// 操作类，成功后直接弹窗提示
				dialog.toast(data.msg || '成功')
			}
			return data
		} else if (data.code === 401) {
			// console.log('11:', 11);
			// token失效
			store.commit('$CGStore', {
				name: '$userInfo',
				value: ''
			})
			dialog.confirm({
				content: '登录后才可体验完整功能，是否登录',
				cancelText: '暂不登录',
				confirmText: '立即登录',
			}).then(() => {
				router.replace('/pages/account/login')
			})
			return Promise.reject(data)
		} else {

			// 如果没有显式定义custom的toast参数为false的话，默认对报错进行toast弹出提示
			if (custom.toast !== false) {
				dialog.toast(response.data.msg || `${response.config.url} code:${response.data.code},请联系管理员`)
			}
			// 如果需要catch返回，则进行reject
			if (custom?.catch) {
				console.error('reject', data)
				return Promise.reject(data)
			} else {
				console.error('pending', data)
				// 否则返回一个pending中的promise，请求不会进入catch中
				return new Promise(() => {})
			}
		}

	}, (response) => {
		const requestKey = generateReqKey(response.config);
		// console.log('pendingRequests:', pendingRequests);
		// pendingRequests.delete(requestKey);
		// 对响应错误做点什么 （statusCode !== 200
		console.error('===response error:', response);
		const custom = response.config?.custom;
		if (response.data.code === 401) {
			store.commit('$CGStore', {
				name: '$userInfo',
				value: ''
			})
			router.reLaunch('/pages/account/login')
			// dialog.confirm({
			// 	content: '登录后才可体验完整功能，是否登录',
			// 	cancelText: '暂不登录',
			// 	confirmText: '立即登录',
			// }).then(() => {
			// 	router.replace('/pages/account/login')
			// })
		}
		if (!custom?.hideToast) {
			dialog.toast(response.data.msg || `statusCode:${response.statusCode},请联系管理员`)
		}
		return Promise.reject(response)
	})
}














export default request